﻿/*-------------------------------------------------------------------------
* 命名空间: SiliconSelect.Common/SqlHelper
* 类       名: SqlHelper
* 功      能:  TD
* 时      间:  2023/6/20 15:58:25
* 版      本:  V1.0
* 作      者:  Fioman
* 格      言:  Talk is cheap,show me the code ^_^
*-------------------------------------------------------------------------*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SiliconSelect.Common
{
    public abstract class SqlHelper
    {
        /// <summary>
        /// 数据库连接字符串
        /// </summary>
        public static readonly string ConnectionString =
            ConfigurationManager.ConnectionStrings["db"].ToString();

        #region ExecuteNonQuery方法

        /// <summary>
        /// 查询的时候不使用这个,因为查询不会影响行数
        /// 一般是插入,删除和修改数据库的时候使用,创建表的时候返回值为-1,
        /// 但是不是执行失败,因为是没有创建行,所以不存在失败.
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <returns>返回一个数值表示此SqlCommand命令影响的行数,一般用>0表示执行成功,小于0表示命令执行失败</returns>
        public static int ExecuteNonQuery(string sql, params SqlParameter[]? parameters)
        {
            using (SqlConnection conn = new SqlConnection(ConnectionString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (parameters != null)
                    {
                        cmd.Parameters.AddRange(parameters);
                    }
                    return cmd.ExecuteNonQuery();
                }
            }
        }

        #endregion


        #region ExecuteScalar(返回单个对象)
        /// <summary>
        /// 返回结果集中的第一行数据,如果有多行数据的话.如果数据集为空返回null
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <returns>返回第一行数据,如果为空,返回null</returns>
        public static object ExecuteScalar(string sql, params SqlParameter[]? parameters)
        {
            using (SqlConnection conn = new SqlConnection(ConnectionString))
            {
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (parameters != null)
                    {
                        cmd.Parameters.AddRange(parameters);
                    }
                    conn.Open();
                    return cmd.ExecuteScalar();
                }
            }
        }
        #endregion

        #region ExecuteReader 执行查询多行多列的方法
        public static SqlDataReader ExecuteReader(string sql, params SqlParameter[]? parameters)
        {
            SqlConnection conn = new SqlConnection(ConnectionString);
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            {
                if (parameters != null)
                {
                    cmd.Parameters.AddRange(parameters);
                }
                try
                {
                    conn.Open();
                    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
                }
                catch (Exception)
                {
                    conn.Close();
                    conn.Dispose();
                    throw;
                }
            }
        }
        #endregion

        #region 返回DataTable的方法
        public static DataTable ExecuteDataTable(string sql, params SqlParameter[]? parameters)
        {
            DataTable dt = new DataTable();
            using (SqlDataAdapter adapter = new SqlDataAdapter(sql, ConnectionString))
            {
                if (parameters != null)
                {
                    adapter.SelectCommand.Parameters.AddRange(parameters);
                }
                adapter.Fill(dt);
            }
            return dt;
        }
        #endregion

        #region 判断数据库中此条数据的条数
        public static int ExcuteGetCount(string sql, params SqlParameter[]? parameters)
        {
            DataTable dt = new DataTable();
            using (SqlDataAdapter adapter = new SqlDataAdapter(sql, ConnectionString))
            {
                if (parameters != null)
                {
                    adapter.SelectCommand.Parameters.AddRange(parameters);
                }
                adapter.Fill(dt);
            }
            return dt.Rows.Count;
        }
    }
}
#endregion